'use strict';
// node.js 文件操作对象
const fs = require('fs');
const path = require('path');
// 数据加密
const crypto = require('crypto');
// 故名思意 异步二进制 写入流
const awaitWriteStream = require('await-stream-ready').write;
// // 管道读入一个虫洞。
const sendToWormhole = require('stream-wormhole');
const Pump = require('mz-modules/pump');
const Controller = require('egg').Controller;
class update2Controller extends Controller {
  /**
     * @api {Post} /api/update 单文件上传
     * @apiGroup 文件上传
     * @apiParam {file} file （必填）
     * @apiParam {INTEGER} type   1商品，2评价, 3轮播图（必填）
     * @apiParamExample 参数模板
     {
      }
     * @apiSuccessExample 成功返回
    {
        "msg": "添加成功",
        "result": {
            "id": 130,
            "path": "http://shops-1251395798.cos.ap-nanjing.myqcloud.com/1600413603112-f121d135f39f03e48da5fe5e8ced5b0a.jpg"
        }
    }
     *
     * @apiErrorExample 错误返回
     * {
     *  "msg":"请选择文件"
     * }
     *
     */
  // 单文件上传
  async index() {
    const { ctx, service } = this;
    try {
      this.md5 = crypto.createHash('md5');
      let stream;

      try {
        stream = await ctx.getFileStream();
      } catch (error) {
        ctx.body = ctx.response.error('请上传文件');
      }
      if (!stream) {
        return;
      }
      // if (!stream.fields.type) {
      //   ctx.body = ctx.response.error('请输入type的值');
      //   return;
      // }

      // 新建一个文件名
      let userData = ctx.adminInfo || ctx.userInfo;
      let filename =
        `_${userData.project_name || '默认项目'}_${+new Date()}_` +
        this.md5.update(stream.filename).digest('hex') +
        path.extname(stream.filename).toLocaleLowerCase();

      const cosData = await ctx.helper._upload(filename, stream);
      // 保存到数据库 返回上传的信息
      ctx.body = await service.shop.goodsPhoto.index(
        cosData,
        stream.fields.type
      );

      // 文件生成绝对路径
      // 当然这里这样是不行的，因为你还要判断一下是否存在文件路径
      // const target = path.join(this.config.baseDir, 'app/public/uploads', filename);
      // // 生成一个文件写入 文件流
      // const writeStream = fs.createWriteStream(target);
      // try {
      //   // 异步把文件流 写入
      //   await awaitWriteStream(stream.pipe(writeStream));
      // } catch (err) {
      //   // 如果出现错误，关闭管道
      //   await sendToWormhole(stream);
      //   throw err;
      // }
      // // 返回上传的信息
      // // ctx.body = ctx.response.success({
      // //   url: '/public/uploads/' + filename,
      // // });
      // // 保存到数据库 返回上传的信息
      // ctx.body = await service.photo.index(path.join('/public/uploads', filename), stream.fields.type);
    } catch (error) {
      ctx.body = ctx.response.error(error.message);
    }
  }
  /**
     * @api {Post} /api/updateM 多文件上传
     * @apiGroup 文件上传
     * @apiParam {file} file （必填）
     * @apiParam {INTEGER} type   1商品，2评价, 3轮播图（必填）
     * @apiParamExample 参数模板
     {
      }
     * @apiSuccessExample 成功返回
     {
        "msg": "添加成功",
        "result": [
            {
                "id": 128,
                "path": "http://shops-1251395798.cos.ap-nanjing.myqcloud.com/1600413578576-f121d135f39f03e48da5fe5e8ced5b0a.jpg"
            },
            {
                "id": 129,
                "path": "http://shops-1251395798.cos.ap-nanjing.myqcloud.com/1600413580121-0d6fd1ff1f18dd1af4e296929a251cc4.jpg"
            }
        ]
    }
     *
     * @apiErrorExample 错误返回
     * {
     *  "msg":"请选择文件"
     * }
     *
     */
  // 多文件上传
  async multiple() {
    const { ctx, service } = this;
    try {
      // autoFields: true 表示除了文件的其它字段
      const parts = this.ctx.multipart({ autoFields: true });

      let stream;
      // 循环获取数据流
      while ((stream = await parts()) != null) {
        // console.log("stream ==>", stream);
        if (!stream.filename) {
          // 多文件上传时，只能break,不能return
          break;
        }

        // 这是 form-data 的字段
        if (!parts.field.type) {
          ctx.body = ctx.response.error('请输入type的值');
          return;
        }

        // 文件位置处理及命名
        let userData = ctx.adminInfo || ctx.userInfo;
        let filename =
          `_${userData.project_name || '默认项目'}_${+new Date()}_` +
          stream.filename;

        // cos 上传处理，成功返回应为一段字符串
        let cosData = await ctx.helper._upload(filename, stream);
        if (typeof cosData !== 'string') {
          return (ctx.body = ctx.response.error(cosData));
        }

        ctx.body = await service.shop.goodsPhoto.index(
          cosData,
          parts.field.type
        );
      }
    } catch (error) {
      ctx.body = ctx.response.error(error.message);
    }
  }
}

module.exports = update2Controller;
